package com.example.mq.service.impl;
import cn.hutool.core.util.IdUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.example.mq.mapper.IdempotentMapper;
import com.example.mq.po.IdempotentPO;
import com.example.mq.service.IdempotentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.support.TransactionTemplate;

/*
@description:
@ClassName IdempotentServiceImpl
@author chen
@create 2025-08-22 16:27
@Version 1.0
*/
@Service
public class IdempotentServiceImpl  implements IdempotentService
{
    @Autowired
    private IdempotentMapper idempotentMapper;
    @Autowired
    private TransactionTemplate transactionTemplate;

    @Override
    public int idempotent(String idempotentKey, Runnable r)
    {
        LambdaQueryWrapper<IdempotentPO> qw = Wrappers.lambdaQuery(IdempotentPO.class)
                .eq(IdempotentPO::getIdempotentKey, idempotentKey);
        IdempotentPO idempotentPO = idempotentMapper.selectOne(qw);
        if (idempotentPO != null)
        {
            // 已处理过返回-1
            return -1;
        }
        //这块一定要通过事务包裹起来
        this.transactionTemplate.executeWithoutResult(action ->
        {
            //2.执行业务
            r.run();

            /**
             * 3.向幂等表插入数据
             * 如果这个地方有并发，则由于（t_idempotent.idempotent_key）的唯一性，会导致有一个会执行失败，抛出异常，导致事务回滚
             */
            IdempotentPO po = new IdempotentPO();
            po.setId(IdUtil.fastSimpleUUID());
            po.setIdempotentKey(idempotentKey);
            this.idempotentMapper.insert(po);
        });

        return 1;
    }
}
